package com.itheima.stock.algorithm;

import com.google.common.collect.Range;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;
import org.joda.time.DateTime;

import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.stream.Collectors;

/**
 * @author by itheima
 * @Date 2022/1/21
 * @Description 定义范围查询命中股票流水表的策略
 */
public class StockRtInfoTableRangeHandler implements RangeShardingAlgorithm<Date> {
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Date> shardingValue) {
        Range<Date> valueRange = shardingValue.getValueRange();
        Collection<String> filters=new HashSet<>();
        if (valueRange.hasLowerBound()) {
            Date startTime = valueRange.lowerEndpoint();
            String startStr = new DateTime(startTime).toString("yyyyMM");
            //过滤获取大于指定日期的值
            availableTargetNames = availableTargetNames.stream().filter(tbName -> {
                String numStr = tbName.substring(tbName.lastIndexOf("_") + 1);
                return Integer.valueOf(numStr) >= Integer.valueOf(startStr);
            }).collect(Collectors.toList());
        }
        if (valueRange.hasUpperBound()) {
            Date endTime = valueRange.upperEndpoint();
            String endStr = new DateTime(endTime).toString("yyyyMM");
            //过滤获取大于指定日期的值
            availableTargetNames = availableTargetNames.stream().filter(tbName -> {
                String numStr = tbName.substring(tbName.lastIndexOf("_") + 1);
                return Integer.valueOf(numStr) <= Integer.valueOf(endStr);
            }).collect(Collectors.toList());

        }
        return availableTargetNames;
    }

    /**
     * m-$->{2021..2022}.stock_rt_info_$->{1..12}
     * @param availableTargetNames 当前逻辑表对应的所有的表名称集合： stock_rt_inf_1~stock_rt_inf_12
     * @param shardingValue 封装了cur_time片键相关的信息
     * @return
     */
//    @Override
//    public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Date> shardingValue) {
//        //获取逻辑表
//        String logicTableName = shardingValue.getLogicTableName();
//        //获取片键
//        String columnName = shardingValue.getColumnName();
//        //获取封装上限和下限的对象
//        Range<Date> valueRange = shardingValue.getValueRange();
//        //1.查询条件如果是根据一个事件点精准查询，交给精准查询的匹配器，不在当前range范围内
//        //2.范围查询
//        //情况4：查询范围超过一年（则分段处理--》将时间范围分段多批次查询处理）
//        //同上上限和下限都存在的情况
//        if (valueRange.hasUpperBound() && valueRange.hasLowerBound()) {
//            Date start = valueRange.lowerEndpoint();
//            DateTime startDateTime = new DateTime(start);
//            //获取年份
//            int startYear = startDateTime.getYear();
//            int startMonth = startDateTime.getMonthOfYear();
//            Date end = valueRange.upperEndpoint();
//            DateTime endDateTime = new DateTime(end);
//            int endYear = endDateTime.getYear();
//            int endMonth = endDateTime.getMonthOfYear();
//            // 情况1：查询的范围在同一个月内（同年同月）----》根据规则，命中同一张表
//            //获取两者的月份间隔
//            int months = Months.monthsBetween(startDateTime, endDateTime).getMonths();
////            if (startYear==endYear && endMonth ==startMonth) {
////
////            }
//            //说明在同一个月
//            if (months==0) {
//                //顾虑出表中包含指定月份的表
//                String tableName = availableTargetNames.stream().filter(tbName -> tbName.endsWith("_" + startMonth)).findFirst().get();
//                return Arrays.asList(tableName);
//            }
//            //情况2：查询范围不跨年（范围在同一年）
//            if (startYear==endYear) {
//                //根据起始时间过滤满足条件的表集合
//                availableTargetNames=availableTargetNames.stream().filter(tbName->Integer.valueOf(tbName.substring(tbName.lastIndexOf("_")+1))>=startMonth).collect(Collectors.toList());
//                //过滤小于结尾的数据的表的集合
//                availableTargetNames=availableTargetNames.stream().filter(tbName->Integer.valueOf(tbName.substring(tbName.lastIndexOf("_")+1))<=endMonth).collect(Collectors.toList());
//                return availableTargetNames;
//            }else{
//                //情况3：查询范围跨年 TODO 如果跨年，则时间范围分段处理，最优 2021.1.13~ 2023.1.21->2021.1.13~2021.12.31 2022整年
//                //根据起始时间过滤满足条件的表集合
//                Set<String> tmp = availableTargetNames.stream().filter(tbName -> Integer.valueOf(tbName.substring(tbName.lastIndexOf("_") + 1)) >= startMonth).collect(Collectors.toSet());
//                Set<String> tmp2 =availableTargetNames.stream().filter(tbName->Integer.valueOf(tbName.substring(tbName.lastIndexOf("_")+1))<=endMonth).collect(Collectors.toSet());
//                //利用set集合合并去重
//                tmp.addAll(tmp2);
//                return tmp;
//            }
//        }else{
//            if (valueRange.hasLowerBound()) {
//                //获取下限 2020
//                Date start = valueRange.lowerEndpoint();
//                //获取年份
//                int startMonth = new DateTime(start).getMonthOfYear();
//                //获取出数据库名称后缀的值大于或者等于起始年的数据库名称集合
//                availableTargetNames=availableTargetNames.stream().filter(tbName->Integer.valueOf(tbName.substring(tbName.lastIndexOf("_")+1))>=startMonth).collect(Collectors.toList());
//                return availableTargetNames;
//            }
//
//
//            if (valueRange.hasUpperBound()) {
//                //获取下限 2023
//                Date end = valueRange.upperEndpoint();
//                //获取年份
//                int endMonth = new DateTime(end).getMonthOfYear();
//                //获取出数据库名称后缀的值小于或者等于起始年的数据库名称集合
//                availableTargetNames=availableTargetNames.stream().filter(tbName->Integer.valueOf(tbName.substring(tbName.lastIndexOf("_")+1))<=endMonth).collect(Collectors.toList());
//                return availableTargetNames;
//            }
//            return null;
//        }
//    }
}
